package org.wlc.demov3;

import com.wlc.util.JsonResult;
import javafx.event.EventHandler;
import org.wlc.demov3.listener.MailEventListener;
import org.wlc.demov3.listener.MessageEventListener;
import org.wlc.demov3.listener.MqEventListener;
import sun.java2d.pipe.hw.AccelDeviceEventNotifier;

/**
 * @author 王立朝
 * @date 2022/5/12
 * @description:
 */
public abstract class LotteryService {

    private EventManager eventManager;

    /**
     * - 另外在构造函数中提供了对事件的定义；`eventManager.subscribe(EventManager.EventType.MQ, new MQEventListener())`。
     * - 在使用的时候也是使用枚举的方式进行通知使用，传了什么类型`EventManager.EventType.MQ`，就会执行什么事件通知，按需添加。
     */
    public LotteryService() {
        eventManager = new EventManager(EventManager.EventType.MQ, EventManager.EventType.MESSAGE,
                EventManager.EventType.MAIL);
        // 提供了对事件的定义，需要什么就执行什么事件通知
        eventManager.subscribe(EventManager.EventType.MQ, new MqEventListener());
        eventManager.subscribe(EventManager.EventType.MESSAGE, new MessageEventListener());
        eventManager.subscribe(EventManager.EventType.MAIL,new MailEventListener());

    }

    public JsonResult draw(String uid) {
        JsonResult jsonResult = doDraw(uid);
        // 需要什么统一就调用什么方法，进行通知所有的监听事件
        eventManager.notify(EventManager.EventType.MQ, jsonResult);
        eventManager.notify(EventManager.EventType.MESSAGE, jsonResult);
        eventManager.notify(EventManager.EventType.MAIL,jsonResult);
        return jsonResult;
    }

    /**
     * 1、这种使用抽象类的方式定义实现方法，可以在方法中扩展需要的额外调用。
     * 并提供抽象类`abstract LotteryResult doDraw(String uId)`，让类的继承者实现。
     * 2、同时方法的定义使用的是`protected`，也就是保证将来外部的调用方不会调用到此方法，只有调用到`draw(String uId)`，
     * 才能让我们完成事件通知。
     * 此种方式的实现就是在抽象类中写好一个基本的方法，在方法中完成新增逻辑的同时，再增加抽象类的使用。而这个抽象类的定义会有继承者实现。
     *
     * @param uid
     * @return
     */
    protected abstract JsonResult doDraw(String uid);
}
